/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sv.com.intesal.compra.controlador;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import sv.com.intesal.clases.Mensaje;
import sv.com.intesal.clases.RutaProyecto;
import sv.com.intesal.clases.XMLReporte;
import sv.com.intesal.clases.cVarios;
import sv.com.intesal.compra.bean.SolicitudMaterial;
import sv.com.intesal.compra.sql.SQLSolicitudMaterial;
import sv.com.intesal.conexion.cConexion;
import sv.com.intesal.seguridad.bean.ParametroSicopi;
import sv.com.intesal.seguridad.controlador.BitacoraControlador;
import sv.com.intesal.seguridad.controlador.ParametroProyectoControlador;
import sv.com.intesal.seguridad.controlador.ParametroSicopiControlador;
import sv.com.intesal.seguridad.controlador.SessionControlador;

/**
 *
 * @author andrew
 */
public class SolicitudMaterialControlador {

    public void setEnca(SolicitudMaterial sm, List<SolicitudMaterial> lista) throws Exception {
        Connection cnn = cConexion.conectar();
        PreparedStatement ps;

        try {
            if (sm.getId_s() == null) {
                SessionControlador sc = new SessionControlador();
                ParametroSicopiControlador pc = new ParametroSicopiControlador();
                ParametroSicopi pp = pc.getParametroSicopi("SOLICITUD_MATERIAL");
                /*AGREGAR*/
                ps = cnn.prepareStatement(SQLSolicitudMaterial.InsertarSolicitud);
                ps.setInt(1, sc.getCodigo_Usuario());
                ps.setDate(2, cVarios.getFecha(sm.getFecha_s()));
                ps.setInt(3, pp.getCorrelativo_ps());

                ps.setString(4, sm.getSolicitante_s());
                ps.setString(5, sm.getDescripcion_s());
                ps.setInt(6, sc.getCodigo_Sucursal());
                ps.setInt(7, pp.getBloque_ps());

                ps.executeUpdate();
                ps.close();
                pc.updateCorrelativo("SOLICITUD_MATERIAL");
            } else {

                ParametroProyectoControlador pp = new ParametroProyectoControlador();
                /*MODIFICAR*/
                ps = cnn.prepareStatement(SQLSolicitudMaterial.updateSolicitud);
                ps.setDate(1, cVarios.getFecha(sm.getFecha_s()));
                ps.setInt(2, sm.getNumero_s());

                ps.setString(3, sm.getSolicitante_s());
                ps.setString(4, sm.getDescripcion_s());
                ps.setInt(5, pp.getParametroProyectoSucursal().getBloque_solicitud_compra());
                ps.setInt(6, sm.getId_s());

                ps.executeUpdate();
                ps.close();
            }

            this.setDeta(sm, lista);
            Mensaje m = new Mensaje();
            if (sm.getId_s() == null) {
                m.messageInfo(m.getIinformation());
            } else {
                m.messageInfo(m.getImodificada());
            }
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    private void setDeta(SolicitudMaterial sm, List<SolicitudMaterial> lista) throws Exception {

        try {
            Integer codigo_sm = sm.getId_s();

            if (sm.getId_s() == null) {
                codigo_sm = this.getMax();
                this.cambiarEstado_Enca("AC", codigo_sm);
            }

            for (int i = 0; i < lista.size(); i++) {
                if (lista.get(i).getId_d() == 0) {
                    PreparedStatement ps = null;
                    Connection cnn = null;
                    cnn = cConexion.conectar();
                    ps = cnn.prepareStatement(SQLSolicitudMaterial.InsertarDetalleSolicitud);
                    ps.setInt(1, codigo_sm);
                    ps.setInt(2, lista.get(i).getId_dm()); /* Id del detalle de material */
                    ps.setDouble(3, lista.get(i).getCantidad_d());
                    ps.executeUpdate();
                }
            }
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void cambiarEstado_Enca(String estado, Integer codigo_s) throws Exception {

        try {
            PreparedStatement ps = null;
            Connection cnn = null;
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLSolicitudMaterial.setEstado_Enca);
            ps.setString(1, estado);
            ps.setInt(2, codigo_s);
            ps.executeUpdate();

            ps.close();
            cnn.close();
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void cambiarEstado_Deta(String estado, Integer id_d) throws Exception {

        try {
            PreparedStatement ps = null;
            Connection cnn = null;
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLSolicitudMaterial.setEstado_Deta);
            ps.setString(1, estado);
            ps.setInt(2, id_d);
            ps.executeUpdate();

            ps.close();
            cnn.close();
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public Integer getMax() throws Exception {
        try {
            ResultSet rs = cConexion.conectar().prepareStatement(SQLSolicitudMaterial.getMax).executeQuery();
            rs.next();
            return rs.getInt("max");

        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<SolicitudMaterial> getConsulta_EncaSolicitudMaterial(SolicitudMaterial s) throws Exception {
        List<SolicitudMaterial> lista = new ArrayList<SolicitudMaterial>();

        try {

            String var_fechas=this.getFiltro_Fechas(s);
            String var_estado = " and s.estado_s='AC' ";

            if (s.getFiltrar_estado() == true) {
                var_estado = " ";
            }
           
            String sql = "select s.id_s,s.bloque_s,s.numero_s,s.fecha_s,s.fechahora,s.solicitante_s,s.estado_s,s.descripcion_s,su.codigo_s,su.nombre_s,u.id_u,u.usuario_u,e.nombre_e || ' ' || e.apellido_e as nombre from solicitud as s,SUCURSAL as su,USUARIO as u, EMPLEADO as e where  su.codigo_s=s.codigo_s and u.id_u=s.id_u and e.id_e=u.id_e "
                    + var_fechas + var_estado
                    + " order by s.numero_s,s.fecha_s,s.fechahora,s.solicitante_s";
            ResultSet rs = cConexion.conectar().prepareStatement(sql).executeQuery();

            while (rs.next()) {
                SolicitudMaterial sm = new SolicitudMaterial();

                /*SOLICITUD*/
                sm.setId_s(rs.getInt("id_s"));
                sm.setDescripcion_s(rs.getString("descripcion_s"));
                sm.setNumero_s(rs.getInt("numero_s"));
                sm.setFecha_s(rs.getDate("fecha_s"));
                sm.setFechahora(rs.getTimestamp("fechahora"));
                sm.setSolicitante_s(rs.getString("solicitante_s"));
                sm.setEstado_s(rs.getString("estado_s"));
                sm.setBloque_s(rs.getInt("bloque_s"));

                /*USUARIO*/
                sm.setId_u(rs.getInt("id_u"));
                sm.setUsuario_u(rs.getString("usuario_u"));

                /*EMPLEADO*/
                sm.setNombre_e(rs.getString("nombre"));

                /*SUCURSAL*/
                sm.setCodigo_s(rs.getInt("codigo_s"));
                lista.add(sm);
            }
            rs.close();
            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    private String getFiltro_Fechas(SolicitudMaterial s) throws Exception {
        try {
            String var_fechas = " ";
             if (s.getFecha_i() != null && s.getFecha_f() == null) {
                var_fechas = " and s.fecha_s >='" + cVarios.getFecha(s.getFecha_i()) + "' ";
            } else if (s.getFecha_f() != null && s.getFecha_i() == null) {
                var_fechas = " and s.fecha_s <='" + cVarios.getFecha(s.getFecha_f()) + "' ";
            } else if (s.getFecha_i() == null && s.getFecha_f() == null) {
                var_fechas = " ";
            } else {
                var_fechas = " and s.fecha_s between '" + cVarios.getFecha(s.getFecha_i()) + "' and '" + cVarios.getFecha(s.getFecha_f()) + "' ";
            }
            return var_fechas;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public SolicitudMaterial getEncaSolicitudMaterial(Integer codigo_sm) throws Exception {
        try {
            PreparedStatement ps = cConexion.conectar().prepareStatement(SQLSolicitudMaterial.getEncaSolicitudMaterial_x_Codigo);
            ps.setInt(1, codigo_sm);

            ResultSet rs = ps.executeQuery();
            SolicitudMaterial sm = new SolicitudMaterial();

            while (rs.next()) {

                /*SOLICITUD*/
                sm.setId_s(rs.getInt("id_s"));
                sm.setDescripcion_s(rs.getString("descripcion_s"));
                sm.setNumero_s(rs.getInt("numero_s"));
                sm.setFecha_s(rs.getDate("fecha_s"));
                sm.setFechahora(rs.getTimestamp("fechahora"));
                sm.setSolicitante_s(rs.getString("solicitante_s"));
                sm.setEstado_s(rs.getString("estado_s"));
                sm.setBloque_s(rs.getInt("bloque_s"));

                /*USUARIO*/
                sm.setId_u(rs.getInt("id_u"));
                sm.setUsuario_u(rs.getString("usuario_u"));

                /*EMPLEADO*/
                sm.setNombre_e(rs.getString("nombre"));

                /*SUCURSAL*/
                sm.setCodigo_s(rs.getInt("codigo_s"));
            }

            return sm;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<SolicitudMaterial> getDetaSolicitudMaterial(Integer codigo_sm) throws Exception {
        List<SolicitudMaterial> lista = new ArrayList<SolicitudMaterial>();

        try {

            PreparedStatement ps = cConexion.conectar().prepareStatement(SQLSolicitudMaterial.getDetaSolicitudMaterial_x_Codigo);
            ps.setInt(1, codigo_sm);
            ResultSet rs = ps.executeQuery();

            while (rs.next()) {
                SolicitudMaterial sm = new SolicitudMaterial();

                /*DEETALLE SOLICITUD*/
                sm.setCantidad_d(rs.getDouble("cantidad_d"));
                sm.setId_d(rs.getInt("id_d"));
                sm.setEstado_d(rs.getString("estado_d"));

                /*MATERIAL*/
                sm.setNombre_m(rs.getString("nombre_m"));

                /*SOLICITUD*/
                sm.setId_s(rs.getInt("id_s"));
                lista.add(sm);
            }

            ps.close();
            rs.close();
            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void anularRegistro(List<SolicitudMaterial> lista) throws Exception {

        try {

            this.cambiarEstado_Enca("A", lista.get(0).getId_s());
            for (int i = 0; i < lista.size(); i++) {
                this.cambiarEstado_Deta("A", lista.get(i).getId_d());
            }

            BitacoraControlador bc = new BitacoraControlador();
            bc.setBitacoraAnulacion(lista.get(0).getId_s(), bc.anulacionSolicitudMaterial + ": " + lista.get(0).getNumero_s(), bc.anulacionSolicitudMaterial);

            Mensaje m = new Mensaje();
            m.messageInfo(m.getIanulada());
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void modificarRegistro(SolicitudMaterial sm) throws Exception {
        try {
            SessionControlador sc = new SessionControlador();
            sc.redireccionar_Codigo_Proceso_Modifcar(sm.getId_s(), RutaProyecto.wfrmSolicitudMaterial);
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void eliminarItem(SolicitudMaterial sm) throws Exception {
        try {
            PreparedStatement ps = cConexion.conectar().prepareStatement(SQLSolicitudMaterial.InsertarDetalleSolicitud);
            ps.setInt(1, sm.getId_d());
            ps.executeUpdate();
            ps.close();

            Mensaje m = new Mensaje();
            m.messageInfo(m.getIeliminada());
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public Boolean getEstado_Validar(SolicitudMaterial sm) throws Exception {
        //si el estado es A=anulado o F=finalizado no se puede modificar o anular registro
        try {
            PreparedStatement ps = cConexion.conectar().prepareCall(SQLSolicitudMaterial.getEstado);
            ps.setInt(1, sm.getId_s());
            ResultSet rs = ps.executeQuery();

            while (rs.next()) {
                if (rs.getString("estado_s").equals("A") || rs.getString("estado_s").equals("F")) {
                    return false;
                }
            }
            return true;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<SolicitudMaterial> getSolicitudMaterialQuick() throws Exception {

        List<SolicitudMaterial> lista = new ArrayList<SolicitudMaterial>();
        try {

            SessionControlador sc = new SessionControlador();
            PreparedStatement ps = cConexion.conectar().prepareStatement(SQLSolicitudMaterial.getEncaSolicitudMateriales_Quick);
            ps.setInt(1, sc.getCodigo_Sucursal());
            ResultSet rs = ps.executeQuery();


            while (rs.next()) {
                SolicitudMaterial sm = new SolicitudMaterial();

                sm.setId_s(rs.getInt("id_s"));
                sm.setNumero_s(rs.getInt("numero_s"));
                sm.setBloque_s(rs.getInt("bloque_s"));
                sm.setSolicitante_s(rs.getString("solicitante_s"));
                sm.setDescripcion_s(rs.getString("descripcion_s"));
                sm.setFecha_s(rs.getDate("fecha_s"));
                sm.setFechahora(rs.getTimestamp("fechahora"));

                sm.setUsuario_u(rs.getString("usuario_u"));
                sm.setNombre_e(rs.getString("nombre_e") + " " + rs.getString("apellido_e"));
                lista.add(sm);
            }

            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<SolicitudMaterial> getDetaSolicitudMaterialQuick(SolicitudMaterial s) throws Exception {
        try {
            List<SolicitudMaterial> lista = new ArrayList<SolicitudMaterial>();
            try {

                PreparedStatement ps = cConexion.conectar().prepareStatement(SQLSolicitudMaterial.getDetaSolicitudMateriales_QUick);
                ps.setInt(1, s.getId_s());
                ResultSet rs = ps.executeQuery();

                while (rs.next()) {
                    SolicitudMaterial sm = new SolicitudMaterial();
                    sm.setCantidad_d(rs.getDouble("cantidad_d"));
                    sm.setNombre_m(rs.getString("nombre_m"));
                    sm.setId_dm(rs.getInt("id_dm"));
                    sm.setId_d(rs.getInt("id_d"));
                    sm.setEstado_d(rs.getString("estado_d"));
                    lista.add(sm);
                }

                return lista;
            } catch (Exception e) {
                throw new Exception(e);
            }
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    /*
    GENERAR REPORTES
     */
    public void generarReporte_SolicitudMaterial(SolicitudMaterial sm) throws Exception {
        try {
            String var_fechas = this.getFiltro_Fechas(sm);
            String var_estado = " and s.estado_s='AC' ";
            String var_codigo = " ";


            if (sm.getFiltrar_estado() == true) {
                var_estado = " ";
            }
            if (sm.getId_s() != null) {
                var_codigo = " and s.id_s=" + sm.getId_s() + " ";
            }
            String sql = "select s.id_s,s.codigo_s,s.numero_s,s.bloque_s,s.descripcion_s,s.fecha_s,s.fechahora,s.solicitante_s,s.estado_s,m.nombre_m,u.usuario_u,d.cantidad_d from SOLICITUD as s,DETALLE_SOLICITUD as d,SUCURSAL as su,MATERIAL_SUCURSAL as ms,MATERIAL as m,USUARIO as u where s.id_s=d.id_s and s.codigo_s=su.codigo_s and ms.id_dm=d.id_dm and m.id_m=ms.id_m and u.id_u=s.id_u "
                    + var_fechas + var_estado + var_codigo + " order by s.codigo_s,s.fecha_s,s.fechahora,s.numero_s,s.solicitante_s,m.nombre_m";

            XMLReporte xml = new XMLReporte();
            xml.Element_XML(sql);
        } catch (Exception e) {
            throw new Exception(e);
        }
    }
}
